package com.kama.client.netty;

import common.message.RpcRequest;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;
import lombok.extern.slf4j.Slf4j;

import java.lang.ref.ReferenceQueue;

/**
 * @author wxx
 * @version 1.0
 * @create 2025/2/13 15:01
 */
@Slf4j
// 继承自 ChannelDuplexHandler 的 Netty 处理器（ChannelHandler），用于处理与连接相关的心跳逻辑
public class HeartbeatHandler extends ChannelDuplexHandler {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        // 事件对象是 IdleStateEvent 时，表示该事件与空闲状态相关。
        if(evt instanceof IdleStateEvent) {
            // 将事件对象强制转换为 IdleStateEvent，以便访问空闲状态信息。
            IdleStateEvent idleStateEvent = (IdleStateEvent) evt;
            // 获取当前的空闲状态（读空闲：长时间没有读取数据，写空闲长时间没有写入数据，总空闲没有读也没有写）
            IdleState idleState = idleStateEvent.state();
            // 判断如果当前状态是 写空闲 (WRITER_IDLE)，表示在一定时间内没有写入数据到通道时，则触发发送心跳包的逻辑
            if(idleState == IdleState.WRITER_IDLE) {
                ctx.writeAndFlush(RpcRequest.heartBeat());
                log.info("超过8秒没有写数据，发送心跳包");
            }
        }else {
            super.userEventTriggered(ctx, evt);
        }
    }
}
